package grupobbva.pe.operhc.domain;

import static grupobbva.pe.operhc.util.Constant.*;
import grupobbva.pe.operhc.util.GenericObject;
import grupobbva.pe.operhc.util.Utilities;

import java.math.BigDecimal;
import java.util.Date;

import org.apache.commons.lang.StringUtils;

public class Contrato extends GenericObject {

	private String numeroContrato;
	private String tipoProducto;
	private String tipoSubProducto;
	private String familiaProducto;
	private String desProducto;
	private String tipoScoring;
	private String tipoOperacion;
	private BigDecimal monto;
	private BigDecimal cuota;
	private BigDecimal tasa;
	private Integer plazo;
	private String fechaEmision;

	public String getNumeroContrato() {
		return numeroContrato;
	}

	public void setNumeroContrato(String numeroContrato) {
		this.numeroContrato = numeroContrato;
	}

	public String getTipoProducto() {
		return tipoProducto;
	}

	public void setTipoProducto(String tipoProducto) {
		this.tipoProducto = tipoProducto;
	}

	public String getTipoSubProducto() {
		return tipoSubProducto;
	}

	public void setTipoSubProducto(String tipoSubProducto) {
		this.tipoSubProducto = tipoSubProducto;
	}

	public String getTipoScoring() {
		return tipoScoring;
	}

	public void setTipoScoring(String tipoScoring) {
		this.tipoScoring = tipoScoring;
	}

	public String getTipoOperacion() {
		return tipoOperacion;
	}

	public void setTipoOperacion(String tipoOperacion) {
		this.tipoOperacion = tipoOperacion;
	}

	public BigDecimal getMonto() {
		return monto;
	}

	public void setMonto(BigDecimal monto) {
		this.monto = monto;
	}

	public BigDecimal getCuota() {
		return cuota;
	}

	public void setCuota(BigDecimal cuota) {
		this.cuota = cuota;
	}

	public BigDecimal getTasa() {
		return tasa;
	}

	public void setTasa(BigDecimal tasa) {
		this.tasa = tasa;
	}

	public Integer getPlazo() {
		return plazo;
	}

	public void setPlazo(Integer plazo) {
		this.plazo = plazo;
	}

	public String getFechaEmision() {
		return fechaEmision;
	}

	public void setFechaEmision(String fechaEmision) {
		this.fechaEmision = fechaEmision;
	}
	
	public String getDesProducto() {
		return desProducto;
	}

	public void setDesProducto(String desProducto) {
		this.desProducto = desProducto;
	}
	
	public String getFamiliaProducto() {
		return familiaProducto;
	}

	public void setFamiliaProducto(String familiaProducto) {
		this.familiaProducto = familiaProducto;
	}

	public Contrato mapearContrato(String contratoInfo) {
		numeroContrato = StringUtils.substring(contratoInfo, 0, 18).trim();
		tipoProducto = StringUtils.substring(contratoInfo, 19, 22).trim();
		tipoScoring = StringUtils.substring(contratoInfo, 23, 25).trim();
		tipoOperacion = StringUtils.substring(contratoInfo, 26, 28).trim();
		String strMonto = StringUtils.substring(contratoInfo, 30, 41).trim();
		String strCuota = StringUtils.substring(contratoInfo, 42, 54).trim();
		String strTasa = StringUtils.substring(contratoInfo, 55, 61).trim();
		String strPlazo = StringUtils.substring(contratoInfo, 62, 65).trim();
		fechaEmision = StringUtils.substring(contratoInfo, 66, 80).trim();
		try {
			monto = new BigDecimal(strMonto);
			cuota = new BigDecimal(strCuota);
			tasa = new BigDecimal(strTasa);
			plazo = Integer.valueOf(strPlazo);
		} catch(Exception e){
			logger.error(formatException(e));
		}
		return this;
	}

	public String getNumeroContratoFinal() {
		String numeroContratoFinal = "";
		if(StringUtils.isNotBlank(numeroContrato)) {
			if(numeroContrato.length()==20) {
				numeroContratoFinal = numeroContrato.substring(0, 8).concat(numeroContrato.substring(10, 20));
			} else {
				numeroContratoFinal = numeroContrato;
			}
		}
		return numeroContratoFinal;
	}
	
	public boolean estaRechazado() {
		return (OPERACION_RECHAZADA.equals(tipoOperacion) || OPERACION_ANULADA.equals(tipoOperacion)); 
	}
	
	public boolean estaVigente(String fechaCadenaEvaluacion) {
		Date fechaEvaluacion = Utilities.obtenerFechaCadena(fechaCadenaEvaluacion, "yyyy-MM-dd");
		Date fechaFormalizacion = Utilities.obtenerFechaCadena(fechaEmision, "yyyy-MM-dd");
		return (fechaFormalizacion.compareTo(fechaEvaluacion) > 0) ? true : false; 
	}
	
	public boolean esFormalizado() {
		return OPERACION_FORMALIZADA.equals(tipoOperacion); 
	}
	
	public boolean esReactivo() {
		return SCORING_REACTIVO.equals(tipoScoring); 
	}
	
	public static boolean validarSinDigitosChequeo(String cuentaEntrada, String cuentaSalida) {
		boolean flag = false;
		String ctaEntradaParte1 = StringUtils.substring(cuentaEntrada, 0, 8);
		String ctaEntradaParte2 = StringUtils.substring(cuentaEntrada, 10, 20);
		String ctaSalidaParte1 = StringUtils.substring(cuentaSalida, 0, 8);
		String ctaSalidaParte2 = StringUtils.substring(cuentaSalida, 10, 20);
		return ctaEntradaParte1.equalsIgnoreCase(ctaSalidaParte1) && ctaEntradaParte2.equalsIgnoreCase(ctaSalidaParte2);
	}

}